package woa.stack;

import java.util.Stack;

/**
 * 逆波兰表达式求值
 * 根据 逆波兰表示法，求表达式的值。
 * 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
 * 说明：
 * 整数除法只保留整数部分。
 * 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
 *
 * 输入：tokens = ["2","1","+","3","*"]
 * 输出：9
 * 解释：该算式转化为常见的中缀算术表达式为：((2 + 1) * 3) = 9
 *
 * @author wangpeng
 * @date 2021/11/29
 */
public class EvalRPNProblem {

    public static int evalRPN(String[] tokens) {
        if (tokens.length == 1) {
            return Integer.parseInt(tokens[0]);
        }
        int rs = 0;
        Stack<Integer> stack = new Stack<>();
        for (String s : tokens) {
            if (!isSign(s)) {
                stack.add(Integer.valueOf(s));
            } else {
                int s1 = stack.pop();
                int s2 = stack.pop();
                rs = calcBySign(s, s2, s1);
                stack.add(rs);
            }
        }

        return rs;
    }

    public static boolean isSign(String s) {
        if ("+".equals(s)
                || "-".equals(s)
                || "*".equals(s)
                || "/".equals(s)) {

            return true;
        }

        return false;
    }

    public static int calcBySign(String sign, int s1, int s2) {
        if ("+".equals(sign)) {
            return s1 + s2;
        } else if ("-".equals(sign)) {
            return s1 - s2;
        } else if ("*".equals(sign)) {
            return s1 * s2;
        } else if ("/".equals(sign)) {
            return s1 / s2;
        }

        return 0;
    }

    public static void main(String[] args) {
        System.out.println(evalRPN(new String[]{"10","6","9","3","+","-11","*","/","*","17","+","5","+"}));
    }
}
